package com.sub.structure;

/**
 * @ClassName SubStack
 * @Description: 栈的实现：基于已实现的动态数组实现的栈，
 * 栈的特点：先进后出，后进先出，栈的底层实现既可以使用数组也可以使用链表，元素只能从栈顶入栈，从栈顶出栈
 * 方法	功能说明
 * int size()	查询栈内元素个数
 * boolean isEmpty()	判断栈是否为空
 * push(E element)	将新元素压入栈中
 * E pop()	将栈顶元素弹出栈，并返回该元素
 * E peek()	获取栈顶元素，但不弹出栈
 * forEach(Consumer<E> consumer)    遍历栈内元素
 * @Author Submerge.
 * @Since 2025/5/19 15:53
 * @Version 1.0
 */
public class SubStack<E> {

    //栈元素容器-动态数组
    private SubDynamicArray<E> stack;

    public SubStack() {
        this.stack = new SubDynamicArray<>();
    }

    /**
     * 查询栈内元素个数
     * @return
     */
    public int size() {
        return this.stack.size();
    }

    /**
     * 判断栈是否为空
     * @return
     */
    public boolean isEmpty() {
        return this.stack.isEmpty();
    }

    /**
     * 将新元素压入栈中：新元素从数组末尾入栈
     * @param element
     */
    public void push(E element) {
        this.stack.add(element);
    }

    /**
     * 将栈顶元素弹出栈，并返回该元素：弹出数组末尾元素，即栈长度减一
     * @return
     */
    public E pop() {
        return this.stack.remove(this.stack.size() - 1);
    }

    /**
     * 获取栈顶元素，但不弹出栈
     * @return
     */
    public E peek() {
        return this.stack.get(this.stack.size() - 1);
    }

    /**
     * 遍历栈内元素
     * @param consumer
     */
    public void forEach(java.util.function.Consumer<E> consumer) {
        this.stack.forEach(consumer);
    }

    @Override
    public String toString() {
        return "SubStack{" +
                "stack=" + stack +
                '}';
    }


}
